import {Request, Response} from 'express'
import {getRepository} from 'typeorm'
import {User} from '../../Entity/User/index.ts' // 确保路径正确
import {validate} from 'class-validator'
import bcrypt from 'bcrypt' // 用于哈希密码
import jwt from 'jsonwebtoken'

class UserController {
    // 单例实例
    private static instance: UserController

    // 私有构造函数，防止外部实例化
    private constructor() {
    }

    // 公共方法获取单例实例
    public static getInstance() {
        if (!UserController.instance) {
            UserController.instance = new UserController()
        }
        return UserController.instance
    }

    // 登录用户
    async login(req: Request, res: Response) {
        const userRepository = getRepository(User);
        const {username, password} = req.body;

        // 查找用户
        const user = await userRepository.findOne({where: {username}});
        if (!user) {
            return res.commonRes.send([], {message: '没有当前用户,请重新注册', success: false}); // 使用更合适的状态码
        }

        // 检查密码
        const isPasswordValid = await userRepository.findOne({where: {password_hash: password}});
        if (!isPasswordValid) {
            return res.commonRes.send([], {message: '无效的密码', success: false});
        }

        // 生成JWT
        const token = jwt.sign({id: user.id}, process.env.JWT_SECRET || 'your_jwt_secret', {expiresIn: '1d'});

        // 返回用户信息和 token
        return res.commonRes.success({user, token}, '登录成功!');
    }

    // 创建用户
    async createUser(req: Request, res: Response) {
        const userRepository = getRepository(User);
        const {username, password, ...rest} = req.body; // 解构请求体，提取用户名和密码

        // 检查是否已存在相同的用户名
        const existingUser = await userRepository.findOne({where: {username}});
        if (existingUser) {
            return res.commonRes.error([], '用户名已被占用', 200); // 409 表示冲突
        }

        // 创建新用户并哈希密码
        // const hashedPassword = await bcrypt.hash(password, 10); // 使用 bcrypt 哈希密码
        const user = userRepository.create({username, password_hash: password, ...rest});

        // 验证用户数据
        // const errors = await validate(user);
        // if (errors.length > 0) {
        //     return res.commonRes.send(errors, {message: '无效的用户数据'}); // 400 表示请求错误
        // }

        // 保存用户到数据库
        await userRepository.save(user);
        return res.commonRes.success(user, '注册成功!');
    }

    // 获取所有用户
    async getAllUsers(req: Request, res: Response) {
        const userRepository = getRepository(User)
        const users = await userRepository.find()
        return res.commonRes.send(users)
    }

    // 根据ID获取用户
    async getUser(req: Request, res: Response) {
        const userRepository = getRepository(User)
        const user = await userRepository.findOne(req.query.id)

        if (!user) {
            return res.commonRes.error({message: 'User not found'})
        }

        return res.commonRes.send(user)
    }

    // 更新用户
    async updateUser(req: Request, res: Response) {
        const userRepository = getRepository(User);
        const userId = Number(req.query.id);

        // 检查用户 ID 是否有效
        if (isNaN(userId)) {
            return res.commonRes.error({message: 'Invalid user ID'}, 400); // 返回 400 错误
        }

        // 查找用户
        const user = await userRepository.findOne(userId);
        if (!user) {
            return res.commonRes.error({message: 'User not found'}, 404); // 返回 404 错误
        }

        // 更新用户信息
        userRepository.merge(user, req.body);

        // // 验证更新后的用户数据
        // const errors = await validate(user);
        // if (errors.length > 0) {
        //     return res.commonRes.error({message: 'Validation failed', errors}, 400); // 返回 400 错误
        // }

        // 保存更新后的用户信息
        await userRepository.save(user);

        return res.commonRes.send(user); // 返回更新后的用户
    }

    // 删除用户
    async deleteUser(req: Request, res: Response) {
        const userRepository = getRepository(User)
        const result = await userRepository.delete(req.query.id)

        if (result.affected === 0) {
            return res.commonRes.error({message: 'User not found'})
        }
        return res.commonRes.send({message: 'User deleted successfully'})
    }
}

// 导出单例实例
export default UserController.getInstance()
